// 属性简洁表示法
// 属性名表达式
// Object.is()
// 扩展运算符与Object.assign()
// in
// 对象的遍历方式


// let id='zsb'
// let age=24
// let s ='school'
// let obj={
//     id,
//     age,
//     [s]:'imooc',
//     say(){
//         console.log('我是谁'+this.id);//我是谁zsb
//     }
// }
// obj.say()
// console.log(obj);//{id: 'zsb', age: 24, school: 'imooc'}


// console.log(Object.is(2,'2'));//fasle
// console.log(Object.is(NaN,NaN));//true


// let obj1={
//     name:'zsb'
// }

// let obj2={
//     name:'zsb'
// }
// console.log(obj1==obj2);//引用类型栈中存放的是引用地址，每次都会开辟新的堆内存空间
// console.log(Object.is(obj1,obj2));//fasle


// Object.assign 用于合并对象
//   let x={
//       a:3,
//       b:4
//   }

// //   let y={...x}
// let y={
//     c:1,
//     a:1
// }
// Object.assign(y,x)
//   console.log(y);//{c: 1, a: 3, b: 4} 后边的会覆盖前边的


// in 判断属性是否在对象上
//   let x={
//       a:3,
//       b:4
//   }
//   console.log( 'a' in x); //true


// in 也可以判断数组当前索引是否有值
// let arr=[1,2,3]
// console.log(1 in arr);//true 
// console.log(3 in arr);//false


// 对象的遍历
let obj={
    name:'zsb',
    age:'11'
}
// for (const key in obj) {
//   console.log(key,obj[key]);
// }

// var arr = [
//     { name:'nick', age:18 },
//     { name:'freddy', age:24 },
//     { name:'mike', age:26 },
//     { name:'james', age:34 }
// ];
// for(var item of arr){	
//     console.log(item.name,item.age);
// }
// for of 与 for in区别
// for of无法循环遍历对象 for in循环遍历的是数组的键值(索引)，而for of循环遍历的是数组的值
// 给数组添加一个自定义属性name，并且赋值"数组"。然后进行遍历输出的，会发现新定义的属性也被for in输出来了，而for of并不会对name进行输出。

// Object.keys(obj).forEach(key=>{
//     console.log(key,obj[key]);
// })

// 新增的两种
// Object.getOwnPropertyNames(obj).forEach(key=>{
//     console.log(key,obj[key]);
// })


//     Reflect.ownKeys(obj).forEach(key=>{
//     console.log(key,obj[key]);
// })